package com.example.controller;

import com.example.model.User;
import com.example.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Optional;

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private UserService userService;

    @GetMapping("/testGet")
    public String testGet() {
        userService.insertUser();
        log.info("请求成功");
        return "success";
    }

    @GetMapping("/findById")
    public String findById(@RequestParam(value = "id") int id) {
        Optional<User> byId = userService.findById(id);
        if (! byId.isPresent()) {
            return "数据不存在";
        }
        User user = byId.get();
        log.info("user={}", user);
        return user.toString();
    }

    @GetMapping("/testTransactional")
    public String testTransactional() {
        /**
         * 父方法无事务注解，子方法有事务注解，事务失败验证
         * 原因: 因为spring事务是基于 jdk 动态代理的，那么同一类的中的方法调用是用 this 调用，父方法没事务注解，那么子方法也会没有
         */
        // userService.insertUserParent();


        /**
         * 多线程中事务失效演示
         */
        userService.threadUser();

        log.info("请求成功");
        return "success";
    }


}
